# 21天通关Python：爬虫作业 1
# 爬取时光网电影TOP100电影信息 （爬取数据包含：名字、导演、评分）  爬虫地址：http://www.mtime.com/top/movie/top100/
# 学员：李子坚（阿坚）
# 2019年6月10日

# -*- coding: utf-8 -*-
import scrapy
from MtimeSpider.items import MtimespiderItem


class TopmovieSpider(scrapy.Spider):
    ''' 
        爬取时光网电影TOP100电影信息的爬虫类
    '''

    # spider的名字
    name = 'topmovie'
    # 定义spider爬取的域名
    allowed_domains = ['mtime.com']
    # 定义spider开始爬取的页面
    start_urls = ['http://www.mtime.com/top/movie/top100/']

    def parse(self, response):
        ''' 
            解析爬虫类要爬取的网页
            response就代表Scrapy下载器所获取的目标的响应
        '''

        # 每个ul/li元素包含一项电影信息
        for top_movie in response.xpath('//ul[@id="asyncRatingRegion"]/li'):
            # 为每项电影信息创建一个Item对象
            item = MtimespiderItem()

            # 获取包含电影排名的div
            info_number = top_movie.xpath('./div[@class="number"]')
            # 提取电影排名
            number_info = info_number.xpath('./em/text()').extract()
            if number_info and len(number_info) > 0:
            	item['number'] = number_info[0]

            # 获取包含电影内容的div
            info_content = top_movie.xpath('./div[@class="mov_con"]')
            # 提取电影名字
            item['title'] = info_content.xpath('./h2/a/text()').extract()[0]
            # 获取包含电影信息的p标签
            info_movie = info_content.xpath('./p')
            # 提取电影导演
            if info_movie and len(info_movie) > 0:
                item['director'] = info_movie[0].xpath('./a/text()').extract_first()
            else:
                item['director'] = ""

            # 获取包含电影评分的span标签
            info_points = top_movie.xpath('./div[@class="mov_point"]/b/span')
            # 提取电影评分
            movie_point = ""
            if info_points:
                for info_point in info_points:
                    movie_point += info_point.xpath('./text()').extract_first()
            item['point'] = movie_point

            # 返回得到的item
            yield item

        # 获取电影TOP 100榜单剩余页面的分页链接
        new_links = response.xpath('//div[@id="PageNavigator"]/a[@class="num"]/@href').extract()
        if new_links:
            for new_link in new_links:
                # 避免重复爬取首页
                if new_link not in self.start_urls:
                    # 发送分页链接爬取请求，并使用self.parse来处理服务器响应
                    yield scrapy.Request(new_link, callback=self.parse)
        